/**
 * src/utils/timerManager.ts
 * ------------------------------------
 * 定时器管理器
 * 统一管理所有定时任务，防止定时器泄漏
 * 创建日期：2025-01-20
 */

type TimerCallback = () => void

class TimerManager {
  private static timers: Map<string, NodeJS.Timeout> = new Map()
  
  /**
   * 设置定时器
   * @param key 定时器唯一标识
   * @param callback 回调函数
   * @param interval 间隔时间(毫秒)
   * @returns 定时器ID
   */
  static setInterval(key: string, callback: TimerCallback, interval: number): NodeJS.Timeout {
    // 清除可能存在的旧定时器
    this.clearInterval(key)
    
    console.log(`设置定时器: ${key}, 间隔: ${interval}ms`)
    const timer = setInterval(callback, interval)
    this.timers.set(key, timer)
    return timer
  }
  
  /**
   * 设置单次定时器
   * @param key 定时器唯一标识
   * @param callback 回调函数
   * @param delay 延迟时间(毫秒)
   * @returns 定时器ID
   */
  static setTimeout(key: string, callback: TimerCallback, delay: number): NodeJS.Timeout {
    // 清除可能存在的旧定时器
    this.clearTimeout(key)
    
    console.log(`设置单次定时器: ${key}, 延迟: ${delay}ms`)
    const timer = setTimeout(() => {
      callback()
      // 自动清理已完成的单次定时器
      this.timers.delete(key)
    }, delay)
    this.timers.set(key, timer)
    return timer
  }
  
  /**
   * 清除指定的定时器
   * @param key 定时器唯一标识
   */
  static clearInterval(key: string): void {
    const timer = this.timers.get(key)
    if (timer) {
      clearInterval(timer)
      this.timers.delete(key)
      console.log(`清除定时器: ${key}`)
    }
  }
  
  /**
   * 清除指定的单次定时器
   * @param key 定时器唯一标识
   */
  static clearTimeout(key: string): void {
    const timer = this.timers.get(key)
    if (timer) {
      clearTimeout(timer)
      this.timers.delete(key)
      console.log(`清除单次定时器: ${key}`)
    }
  }
  
  /**
   * 清除所有定时器
   */
  static clearAll(): void {
    console.log(`清除所有定时器，当前数量: ${this.timers.size}`)
    this.timers.forEach((timer, key) => {
      clearInterval(timer)
      console.log(`清除定时器: ${key}`)
    })
    this.timers.clear()
  }
  
  /**
   * 获取当前定时器数量
   * @returns 定时器数量
   */
  static getTimerCount(): number {
    return this.timers.size
  }
  
  /**
   * 获取所有定时器的键名
   * @returns 定时器键名列表
   */
  static getTimerKeys(): string[] {
    return Array.from(this.timers.keys())
  }
  
  /**
   * 检查指定定时器是否存在
   * @param key 定时器唯一标识
   * @returns 是否存在
   */
  static hasTimer(key: string): boolean {
    return this.timers.has(key)
  }
}

export { TimerManager } 